// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
const _ = db.command
// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
  let result = false // 支付成功，返回true，支付失败，返回false
  let errMsg = '' // 支付过程当中出现错误，存储错误信息，并返回给小程序端
  /**
   * 获取用户的级别信息
   * 1)获取用户的信息
   * 2）获取所有级别
   * 3）根据用户的growthValue的值判断用户在那个级别中
   */
  // 查询当前登录小程序的用户信息
  let user = (await db.collection('user').where({
    _openid: wxContext.OPENID
  }).get()).data[0]
  // 查询所有的级别信息
  let levels = (await db.collection('level').get()).data
  // 获取用户的级别信息
  let userLevel = levels.filter(item => user.growthValue >= item.minGrowthValue && user.growthValue <= item.maxGrowthValue)[0]
  // 获取当前用户等级购买套餐时优惠的积分
  let discount = userLevel.bonus.length === 3 ? userLevel.bonus[2].discount : 0
  // 查询用户选择的套餐的数据
  let membershipPlan = (await db.collection('membership_plan').where({
    id: event.membershipPlanId
  }).get()).data[0]
  // 计算用户购买套餐实际的支付积分
  let paymentFree = membershipPlan.price - discount
  // 计算用户此次购买会员后剩余的积分
  let newPoint = user.point - paymentFree
  /**
   * 计算用户购买套餐的有效期：起始时间和结束时间
   * 起始时间的计算：如果用户当前不是会员，则起始时间就是当前时间；如果用户当前处于会员有效期内，则起始时间顺延
   */
  let fromDate = new Date()
  if (user.memberExpDate > fromDate) {
    fromDate = user.memberExpDate
  }
  // 计算结束时间（转换成时间戳拼接）
  let memberExpDate = new Date(fromDate.getTime() + membershipPlan.validity * 30 * 24 * 60 * 60 * 1000)
  // 判断用户的积分是否足够购买当前选择的套餐
  if (user.point < paymentFree) {
    errMsg = 'point no enough' // 抱歉，您的积分不足，无法购买
  } else {
    // 向user_point表中插入一条积分销号记录
    await db.collection('user_point').add({
      data: {
        _openid: wxContext.OPENID,
        changePoints: -1 * paymentFree,
        operation: '购买会员',
        date: db.serverDate(),
        orderId: '', //订单编号
        timestamp: '' //运动步数
      }
    })
    // 向user_membership 表插入用户的购买记录
    await db.collection('user_membership').add({
      data: {
        _openid: wxContext.OPENID,
        date: db.serverDate(),
        membershipPlanId: event.membershipPlanId, // 购买的套餐id
        userLevel: userLevel.id, // 用户当前等级ID
        price: membershipPlan.price, // 套餐的优惠价格
        discount: discount, // 当前用户购买套餐时的优惠积分
        paymentFee: paymentFree, // 当前用户购买套餐的实际支付价格
        fromDate: fromDate,
        toDate: memberExpDate
      }
    })
    // 修改user表中的用户积分和会员有效期
    let updateResult = await db.collection('user').where({
      _openid: wxContext.OPENID
    }).update({
      data: {
        point: newPoint,
        memberExpDate: memberExpDate
      }
    })
    // 根据更新的结果，设置返回值
    if (updateResult.stats.updated === 1) {
      result = true
    } else {
      errMsg = 'pay error' // 支付异常，购买会员失败
    }
  }
  return {
    data: result,
    errMsg: errMsg
  }
}